#include "wdt.h"
#include "STC89C5xRC.H"

/**
 * @brief wdt_init
 *
 * @param wdt_tim
 */
void wdt_init(wdt_tim_t wdt_tim)
{
#if (FOSC == FOSC_11_M)
    switch (wdt_tim)
    {
    case TIM_71_1_MS:
        WDT_CONTR = 0xE8; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_142_2_MS:
        WDT_CONTR = 0xE9; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_284_4_MS:
        WDT_CONTR = 0xEA; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_568_8_MS:
        WDT_CONTR = 0xEB; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_1_1_S:
        WDT_CONTR = 0xEC; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_2_27_S:
        WDT_CONTR = 0xED; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_4_5_S:
        WDT_CONTR = 0xEE; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_9_1_S:
        WDT_CONTR = 0xEF; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    default:
        break;
    }
#elif (FOSC == FOSC_12_M)
    switch (wdt_tim)
    {
    case TIM_65_5_MS:
        WDT_CONTR = 0xE8; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_131_0_MS:
        WDT_CONTR = 0xE9; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_262_1_MS:
        WDT_CONTR = 0xEA; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_524_2_MS:
        WDT_CONTR = 0xEB; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_1_048_S:
        WDT_CONTR = 0xEC; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_2_097_S:
        WDT_CONTR = 0xED; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_4_194_S:
        WDT_CONTR = 0xEE; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_8_388_S:
        WDT_CONTR = 0xEF; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    default:
        break;
    }
#elif (FOSC == FOSC_20_M)
    switch (wdt_tim)
    {
    case TIM_39_3_MS:
        WDT_CONTR = 0xE8; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_78_6_MS:
        WDT_CONTR = 0xE9; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_157_3_MS:
        WDT_CONTR = 0xEA; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_314_6_MS:
        WDT_CONTR = 0xEB; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_629_1_S:
        WDT_CONTR = 0xEC; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_1_25_S:
        WDT_CONTR = 0xED; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_2_5_S:
        WDT_CONTR = 0xEE; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    case TIM_5_S:
        WDT_CONTR = 0xEF; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
        break;
    default:
        break;
    }
#endif
}

/**
 * @brief clear_wdt
 *
 */
void clear_wdt(void)
{
    /* feed dwt start */
    WDT_CONTR = WDT_CONTR | 0x10; /* |NULL|NULL|EN_WDT|CLR_WDT|IDLE_WDT|PS2|PS1|PS0| */
    /* feed dwt end */
}
